home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_556 / scheme2c / scheme-src.lzh / scrt / mips.s < prev    next >
Text File  |  1991-10-11  |  4KB  |  176 lines

  1. /*
  2.  * SCHEME->C
  3.  *
  4.  * MIPS assembly code.
  5.  *
  6.  */
  7.  
  8. /*              Copyright 1989 Digital Equipment Corporation
  9.  *                         All Rights Reserved
  10.  *
  11.  * Permission to use, copy, and modify this software and its documentation is
  12.  * hereby granted only under the following terms and conditions.  Both the
  13.  * above copyright notice and this permission notice must appear in all copies
  14.  * of the software, derivative works or modified versions, and any portions
  15.  * thereof, and both notices must appear in supporting documentation.
  16.  *
  17.  * Users of this software agree to the terms and conditions set forth herein,
  18.  * and hereby grant back to Digital a non-exclusive, unrestricted, royalty-free
  19.  * right and license under any changes, enhancements or extensions made to the
  20.  * core functions of the software, including but not limited to those affording
  21.  * compatibility with other hardware or software environments, but excluding
  22.  * applications which incorporate this software.  Users further agree to use
  23.  * their best efforts to return to Digital any such changes, enhancements or
  24.  * extensions that they make and inform Digital of noteworthy uses of this
  25.  * software.  Correspondence should be provided to Digital at:
  26.  * 
  27.  *                       Director of Licensing
  28.  *                       Western Research Laboratory
  29.  *                       Digital Equipment Corporation
  30.  *                       100 Hamilton Avenue
  31.  *                       Palo Alto, California  94301  
  32.  * 
  33.  * This software may be distributed (but not offered for sale or transferred
  34.  * for compensation) to third parties, provided such third parties agree to
  35.  * abide by the terms and conditions of this notice.  
  36.  * 
  37.  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
  38.  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
  39.  * MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
  40.  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  41.  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  42.  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  43.  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  44.  * SOFTWARE.
  45. */
  46.  
  47. /* sc_s0tos8 returns the values of s0-s8 in the caller supplied buffer.  These
  48.    are the "callee" save registers which need to be examined during garbage
  49.    collection.
  50. */
  51.  
  52. #include <mips/regdef.h>
  53.  
  54.     .text    
  55.     .align    2
  56.     .globl    sc_s0tos8
  57.     .ent    sc_s0tos8
  58. sc_s0tos8:
  59.     .frame    sp, 0, ra
  60.     sw    s0, 0(a0)
  61.     sw    s1, 4(a0)
  62.     sw    s2, 8(a0)
  63.     sw    s3, 12(a0)
  64.     sw    s4, 16(a0)
  65.     sw    s5, 20(a0)
  66.     sw    s6, 24(a0)
  67.     sw    s7, 28(a0)
  68.     sw    s8, 32(a0)
  69.     j    ra
  70.     .end    sc_s0tos8
  71.  
  72. /* sc_setsp sets the stack pointer to the argument value.  It is necessary
  73.    as longjmp checks to assure that the call is an "upexit".
  74. */
  75.     .text
  76.     .align    2
  77.     .globl    sc_setsp
  78.     .ent    sc_setsp
  79. sc_setsp:
  80.     .frame    sp, 0, ra
  81.     or    sp, a0, a0
  82.     j    ra
  83.     .end    sc_setsp
  84.  
  85.  
  86. /**************************************************************************
  87.  The following 4 arithmetic subroutines use MIPS instructions that generate
  88.  overflow exceptions which can then be trappped. 
  89.  **************************************************************************/
  90.  
  91. /* sc_iplus uses the 'add' instruction to calculate the sum of the two
  92.    integer arguments.  
  93. */
  94.  
  95.     .text    
  96.     .align    2
  97.     .globl    sc_iplus
  98.     .ent    sc_iplus
  99. sc_iplus:
  100.     .frame    sp, 0, ra
  101.     add    v0, a0, a1
  102.     j    ra
  103.     .end    sc_iplus
  104.  
  105. /* sc_idifference uses the 'sub' instruction to calculate the difference
  106.    of the two integer arguments.
  107. */
  108.  
  109.     .text    
  110.     .align    2
  111.     .globl    sc_idifference
  112.     .ent    sc_idifference
  113. sc_idifference:
  114.     .frame    sp, 0, ra
  115.     sub    v0, a0, a1
  116.     j    ra
  117.     .end    sc_idifference
  118.  
  119.  
  120. /* sc_inegate also uses the 'sub' instruction to calculate the negation of 
  121.    the integer argument.
  122. */
  123.  
  124.     .text    
  125.     .align    2
  126.     .globl    sc_inegate
  127.     .ent    sc_inegate
  128. sc_inegate:
  129.     .frame    sp, 0, ra
  130.     sub    v0, $0, a0
  131.     j    ra
  132.     .end    sc_inegate
  133.  
  134.  
  135. /* sc_itimes uses the 'mult' instruction to calculate the product of the 
  136.    two integer arguments.
  137. */
  138.  
  139.     .text    
  140.     .align    2
  141.     .globl    sc_itimes
  142.     .ent    sc_itimes
  143. sc_itimes:
  144.     subu    sp, 24
  145.     sw    ra, 20(sp)
  146.     sd    a0, 24(sp)
  147.     .mask    0x80000000, -4
  148.     .frame  sp, 24, ra
  149.  
  150.     mult    a0, a1
  151.  
  152.     mfhi    t0
  153.     mflo    t1
  154.     sra    t1, t1, 31
  155.      bne    t0, t1, $overflow
  156.  
  157.     mflo    v0
  158.  
  159.     lw    ra, 20(sp)
  160.     addu    sp, 24
  161.     j    ra
  162.  
  163. $overflow:
  164.     mtc1    a0, $f4
  165.     cvt.d.w    $f6, $f4
  166.     srl     t1, a1, 2
  167.     mtc1    t1, $f8
  168.     cvt.d.w $f10, $f8
  169.     mul.d    $f12, $f6, $f10
  170.     jal    sc_makefloat64
  171.     lw    ra, 20(sp)
  172.     addu    sp, 24
  173.     j    ra
  174.     .end    sc_itimes
  175.  
  176.